
package controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import model.UnidadeModel;
import model.service.UnidadeService;
import util.ColorRowRenderer;
import view.UnidadeTableModel;
import view.UnidadeUI;

public class UnidadeCtrl implements ActionListener,
                                    ListSelectionListener {
    
    private UnidadeModel model;
    private UnidadeService service;
    private UnidadeUI unidadeUI;
    private UnidadeTableModel tableModel;   
    

    public UnidadeCtrl() {                 
        model = UnidadeModel.getInstance();             
        unidadeUI = new UnidadeUI(this) ;
        service = new UnidadeService();
        initialize();
    }       
   
    public List<UnidadeModel> getUnidadeFromFilter(int iOpcao, String iPesquisa) {        
        return service.getUnidadeFromFilter(iOpcao, iPesquisa);              
    }

    public List<UnidadeModel> getUnidades() {  
        return service.getUnidades();           
    }    
    
    public void atualizarDadosTable(){         
        //initTableModel();
    }
         
    private void initialize(){
        unidadeUI.initComponentes();        
        disablableButtonsToSaveAction();
        atualizarDadosTable();        
        unidadeUI.icoTitle(); 
        setActionCommandButtons();
        attachListener();
        initTableModel();
        limpaTela();        
        unidadeUI.setVisible(true);
        model.registrarObserver(unidadeUI); 
        initStatusBar();
        setHintsButtons();
    }
    
    private void setHintsButtons() {
        unidadeUI.getBtnNovo().setToolTipText("Nova Unidade");
        unidadeUI.getBtnAlterar().setToolTipText("Editar Unidade");
        unidadeUI.getBtnExcluir().setToolTipText("Deletar Unidade");
        unidadeUI.getBtnSalvar().setToolTipText("Salvar Unidade");
        unidadeUI.getBtnCancelar().setToolTipText("Cancelar Transação");
        unidadeUI.getBtnPesquisar().setToolTipText("Pesquisar Unidades");
    }

    private void setActionCommandButtons() {
        unidadeUI.getBtnNovo().setActionCommand("Novo");
        unidadeUI.getBtnAlterar().setActionCommand("Alterar");
        unidadeUI.getBtnExcluir().setActionCommand("Excluir");
        unidadeUI.getBtnSalvar().setActionCommand("Salvar");
        unidadeUI.getBtnCancelar().setActionCommand("Cancelar");        
        unidadeUI.getBtnPesquisar().setActionCommand("Buscar");
    }
    
    private void initStatusBar(){         
          unidadeUI.getBtnNovo().addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
               
            }

            @Override
            public void mousePressed(MouseEvent e) {
               
            }

            @Override
            public void mouseReleased(MouseEvent e) {
               
            }

            @Override
            public void mouseEntered(MouseEvent e) {                
                unidadeUI.getLblStatusBar().setText("Clique para inserir uma nova Unidade.");                 
                unidadeUI.getPanelStatusBar().add(unidadeUI.getLblStatusBar());           
            }

            @Override
            public void mouseExited(MouseEvent e) {
               unidadeUI.getLblStatusBar().setText("Controle de Unidades: Inserir, Remover, Alterar e Pesquisar Unidades.");            
            }
        });    
    
    }
    
    
    public void limpaTela(){
        unidadeUI.getTxtCodigo().setText("0");
        unidadeUI.getTxtDescricao().setText(null);          
    }
    
    public void attachListener() {        
        
        unidadeUI.getBtnPrimeiro().addActionListener(this);
        unidadeUI.getBtnAnterior().addActionListener(this);
        unidadeUI.getBtnProximo().addActionListener(this);
        unidadeUI.getBtnUltimo().addActionListener(this);
        
        unidadeUI.getBtnNovo().addActionListener(this);
        unidadeUI.getBtnSalvar().addActionListener(this);
        unidadeUI.getBtnCancelar().addActionListener(this);
        unidadeUI.getBtnExcluir().addActionListener(this);
        unidadeUI.getBtnPesquisar().addActionListener(this);
        unidadeUI.getBtnAlterar().addActionListener(this);
        
                
    }

    private void initTableModel(){        
   
        tableModel = new UnidadeTableModel(service.getUnidades());        
               
        unidadeUI.getTblUnidades().setModel(tableModel);        
        unidadeUI.getTblUnidades().getSelectionModel().addListSelectionListener(this);
        colorRenderer();
        
        unidadeUI.getLblRowCount().setText("Total :  "+String.valueOf(unidadeUI.getTblUnidades().getRowCount()));
        unidadeUI.getLblRowCount().setHorizontalAlignment(JLabel.RIGHT);    
       
    }
    
    private void colorRenderer(){        
        for (int i=0;i<unidadeUI.getTblUnidades().getColumnCount();i++)         
                 unidadeUI.getTblUnidades().getColumn(unidadeUI.getTblUnidades().getColumnName(i)).setCellRenderer(new ColorRowRenderer());         
    }
    
    private void enableButtonsToSaveAction() {
        enableOrDisableButtonsToEdit(true);
    }

    private void disablableButtonsToSaveAction() {
        enableOrDisableButtonsToEdit(false);
    }
    
    private void enableOrDisableButtonsToEdit ( boolean enabled ) {
        unidadeUI.getBtnNovo().setEnabled(!enabled);
        unidadeUI.getBtnAlterar().setEnabled(!enabled);
        unidadeUI.getBtnPesquisar().setEnabled(!enabled);
        unidadeUI.getBtnExcluir().setEnabled(!enabled);
        unidadeUI.getBtnSalvar().setEnabled(enabled);
        unidadeUI.getBtnCancelar().setEnabled(enabled);        
    }
    
    private void novo() {
        enableButtonsToSaveAction();
        limpaTela();
        //unidadeUI.getTxtCodigo().setText(String.valueOf(service.getNextId()));
    }
    
    private void update() {
        if ( !"0".equals(unidadeUI.getTxtCodigo().getText()) ) {
            enableButtonsToSaveAction();
        } else {
            JOptionPane.showMessageDialog(unidadeUI, "Selecione uma Unidade.");
        }
                
    }
    
    private void search(){
        
    }
    
    private void delete() {        
        service.delete(frmToUnidade());
        tableModel.removeUnidade(frmToUnidade());
    }
    
    private void save () {         	
           
        frmToUnidade();
                
        if (model.getCodigo() != 0 ) {
            tableModel.updatedUnidade(model);
            service.atualizar(model);
	} else {               
            model.setCodigo(service.getNextId());           
            tableModel.addUnidade(model);              
            service.inserir(model);
        }                
        
        //initTableModel();
        
        unidadeUI.getTxtCodigo().setText(String.valueOf(service.getNextId() - 1));
        JOptionPane.showMessageDialog(unidadeUI,"Unidade Salva" , "Salvar" , JOptionPane.INFORMATION_MESSAGE);        
        
        colorRenderer();
        disablableButtonsToSaveAction();
    }  
    
    private void cancel () {  
        disablableButtonsToSaveAction();       
    }
    
    private UnidadeModel frmToUnidade(){              
        model.setCodigo( Integer.parseInt( unidadeUI.getTxtCodigo().getText() ) );         
        model.setDescricao( unidadeUI.getTxtDescricao().getText() );        
        return model;               
    }
    
    private void unidadeToFrm(UnidadeModel unidade){
        unidadeUI.getTxtCodigo().setText(Integer.toString(unidade.getCodigo()));
        unidadeUI.getTxtDescricao().setText(unidade.getDescricao());
    }

    @Override
    public void actionPerformed(ActionEvent event) {        
        
        switch (event.getActionCommand()) {
            case "Novo": novo(); break;
            case "Buscar": search(); break;
            case "Alterar": update(); break;
            case "Excluir": delete(); break;
            case "Salvar": save(); break;
            case "Cancelar": cancel(); break;
        }
    }

    @Override
    public void valueChanged(ListSelectionEvent event) {        
        if (unidadeUI.getTblUnidades().getSelectedRow() != -1) {
            model = tableModel.getUnidade(unidadeUI.getTblUnidades().getSelectedRow());            
            unidadeToFrm(model);  
        }        
    }
    
}
